/** @jsxImportSource @emotion/react */
import * as React from "react";
import {
    InputLine,
    Input,
    TextArea,
    InputDatalist,
    Text,
    CheckSwitch,
    SuffixInput,
    useTheme,
    LineColumn, Table, TableRow, CCell, TableBody, BlobInputList,  Alert,
} from "customize-easy-ui-component";
import {
    InspectRecordLayout, InternalItemProps, SelectHookfork,  useItemInputControl
} from "../../common/base";
import {Each_ZdSetting,  useTableEditor,} from "../../hook/useRepTableEditor";
import {useMeasureInpFilter} from "../../common/hooks";
import {arraySetInp, calcAverageArrObj, floatInterception} from "../../../common/tool";
import {setupItemAreaRoute} from "./orcIspConfig";
import {norms制动试验} from "./repView";
import {useBalanceCoefficient} from "../../elevator/hook/useBalanceCoefficient";
import {useCalcEvalTotalScore} from "../hook/useCalcEvalTotalScore";
import {EditStorageContext} from "../../StorageContext";

//评估 下结论页面：
export const ItemConclusion=
    React.forwardRef((
        { children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const theme = useTheme();
        const getInpFilter = React.useCallback((par: any) => {
            const {检验日期,级别整,本体状,建议,评估结论,大备注,unq,unqA,unqB} =par||{};
            return {检验日期,级别整,本体状,建议,评估结论,大备注,unq,unqA,unqB};
        }, []);
        const {inp, setInp} = useItemInputControl({ ref });
        //【特殊需要】 提取全部的配置
        const impressionismAs =React.useMemo(() => {
            return setupItemAreaRoute({verId:'1', repId:'1', theme});
        }, [theme]);
        //特例：直接从 底层状态总库当中 获取数据。
        const {storage, } =React.useContext(EditStorageContext) as any;
        const evalTotalScore=floatInterception(useCalcEvalTotalScore({itRes:storage, ItemArs:impressionismAs?.Item}),2);

        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'五、评估结论'}>
                四、 评估原始记录表， 总得分：{evalTotalScore} <br/>(一) 电梯安全状况：通过对该电梯的安全性能技术评估，该电梯设备本体安全状况分值为={evalTotalScore} <br/>
                备注：项目编号后A表示必须整改项目、B表示现行安全技术规范或标准新要求的项目,无标注的表示建议整改项目，标有※的项目为应当遵循“水桶短板理论”的评估项目。
                <hr/>
                <Text  variant="h5">
                    五、评估结论， 评估综述。
                </Text>
                评估综述：
                <LineColumn column={6} >
                    <InputLine  label='电梯安全级别整体水平为' >
                        <SuffixInput  value={inp?.级别整 ||''} onSave={txt=> setInp({...inp,级别整: txt || undefined })}>级</SuffixInput>
                    </InputLine>
                    <InputLine  label='电梯本体状态' >
                        <Input  value={inp?.本体状 ||''}
                                onChange={e => setInp({...inp,本体状:e.currentTarget.value || undefined}) }/>
                    </InputLine>
                </LineColumn>
                (二)存在的风险：<br/>
                1、存在 {inp?.unqA?.length || '<未初始化>'} 个不符合项目，这些项目不符合《电梯监督检验和定期检验规则— 曳引与强制驱动电梯》（TSG T7001-2009 含1、2、3号修改单），已存在一定安全风 险，必须整改（详见表1）。<br/>
                2、存在 {inp?.unq?.length || '<未初始化>'} 个不符合项目，虽然能够符合现行安全技术规范要求，但其安全技 术性能降低，具有一定的潜在安全风险，对以上项目建议整改（详见表2）。在整改完成 前，维保单位应当加强日常维护保养，使用单位应当采取有效的安全监护措施；<br/>
                3、存在 {inp?.unqB?.length || '<未初始化>'} 个不符合项目，该电梯执行旧的安全技术规范和标准，因为新旧安 全技术规范或标准的要求不一致，导致这些项目不符合现行安全技术规范或标准的要求 （详见表3），如电梯需要更新、改造时涉及这些项目，应按照现行安全技术规范或标准 的要求执行。<br/>
                评估结论：
                <InputLine  label='（三）、使用维保建议' >
                    <BlobInputList  value={inp?.建议 ||''} rows={8} onListChange={v => setInp({...inp,建议:v || undefined}) }
                        datalist={["维保单位应根据电梯零部件存在风险的评估分析，按照TSG T5002-2017《电梯维护保养规则》要求，对电梯薄弱环节的零部件加强监控；除了按TSG T5002-2017《电梯维护保养规则》做好维护保养外，零部件存在风险而未达到功能失效，暂时不需要更换新零部件或对原有零部件拆卸、加工、修理的项目，应增加维护保养频次和维护保养项目。"]}
                    />
                </InputLine>
                <Text  variant="h4">评估结论 》</Text>
                1、经过对电梯所存在的风险及电梯运行能力综合分析，建议：{inp?.评估结论} 。
                <InputLine  label='评估结论，建议：' >
                    <Input  value={inp?.评估结论 ||''}
                            onChange={e => setInp({...inp,评估结论:e.currentTarget.value || undefined}) }/>
                </InputLine>
                2、如果使用单位完成本报告书表1、2、3的全部项目整改，该电梯的下次评估时间为8 年，否则该电梯的下次评估时间为5年。
                <div><Text  variant="h5">备注:</Text>
                    <BlobInputList  value={inp?.大备注 ||''}  rows={5}
                                    onListChange={v => setInp({ ...inp, 大备注: v || undefined}) } />
                </div>
                <InputLine  label='设置评估日期' >
                    <Input  value={inp?.检验日期 ||''}  type='date'
                            onChange={e => setInp({ ...inp, 检验日期: e.currentTarget.value}) } />
                </InputLine>
            </InspectRecordLayout>
        );
    } );

/**不要重名了 ['附设装置名称','附设装置'] 可能莫名其妙报错的。台账snapshot.‘安装单位’等不能直接使用的，要本次最新:易变动。
 * 设备概况有些字段不在台账存在的，还有些不想采用台账的数据，还有些事后才能够同步给台账的；
 * */
const dbName设备概况 =[
    {desc:'联系人',name:'安管人员'},{desc:'联系电话',name:'安管电话'},
];
const itemA设备概=['限超过','发生过','被重大','行环境','行状况'];
dbName设备概况.forEach(({name} : any, i:number)=> {
    itemA设备概.push( name );
});
/**注意这里的ref不是窗口<DIV ref={ref}>的哪一个;而是 React.useRef<InternalItemHandResult>(null)类似的传递数据和接口函数的,不是一个东西;
 * */
export const DeviceSurvey=
    React.forwardRef((
        { children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const theme = useTheme();
        const [getInpFilter]=useMeasureInpFilter(null,itemA设备概,);
        const {inp, setInp} = useItemInputControl({ ref });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'二、设备概况'}>
                没法事前申请变更在台账中生效的还需要修正的设备概况部分:
                <LineColumn  column={3} >
                    {           /* 剔除最后一个”备注“要单独处理的 */
                        dbName设备概况.map(({name,desc,cb,type,unit,list} : any, i:number)=> {
                            // if(i>=dbName设备概况2.length-1)      return <React.Fragment key={i}></React.Fragment>;
                            if(cb?.edit){
                                return  cb.edit(inp,setInp);
                            }
                            else if(type==='l') return <InputLine key={i} label={desc}>
                                    <InputDatalist value={(inp?.[name]) || ''} datalist={list}
                                               onListChange={v => {
                                                   setInp({ ...inp, [name]:v || undefined});
                                               } } />
                                </InputLine>;
                            else if(type==='d') return  <InputLine key={i} label={desc}>
                                    <Input  value={inp?.[name] ||''}  type='date'
                                            onChange={e => setInp({ ...inp, [name]: e.currentTarget.value}) } />
                                </InputLine>;
                            else if(type==='b') return  <InputLine key={i} label={desc}>
                                <CheckSwitch  checked={inp?.[name] || false} onChange={e => setInp({...inp, [name]: inp?.[name]? undefined:true}) } />
                                </InputLine>;
                            else if(type==='B')  return  <InputLine key={i} label={desc}>
                                        <BlobInputList  value={inp?.[name] ||''} datalist={list}
                                                        onListChange={v => setInp({ ...inp, [name]: v || undefined}) } />
                                    </InputLine>;
                            else if(type==='m')  return <div key={i}>{desc}:
                                         <TextArea  value={inp?.[name] ||''} rows={4}
                                            onChange={e => setInp({ ...inp, [name]: e.currentTarget.value||undefined}) } />
                                    </div>;
                            else if(unit) return  <InputLine key={i} label={desc}>
                                    <SuffixInput  value={inp?.[name] ||''} onSave={txt=> setInp({...inp,[name]: txt || undefined })}
                                              type={type==='n'? "number": undefined}>{unit}</SuffixInput>
                                </InputLine>;
                            else return  <InputLine label={desc+`:`} key={i}>
                                    <Input  value={inp?.[name] ||''} type={type==='n'? "number": undefined}
                                            onChange={e => {
                                                setInp({...inp,[name]:e.currentTarget.value || undefined});
                                            } } />
                                </InputLine>;
                        })
                    }
                </LineColumn>
                <Text variant="h5">
                  设备使用情况:
                </Text>
                该电梯投入使用年限超过
                <Input value={inp?.限超过 ||''} size={2} style={{display: 'inline-flex', width: 'unset'}}
                        onChange={e => setInp({ ...inp, 限超过: e.currentTarget.value||undefined }) }/>
                年，期间电梯
                <Input value={inp?.发生过 ||''} size={2} style={{display: 'inline-flex', width: 'unset'}}
                                  onChange={e => setInp({ ...inp, 发生过: e.currentTarget.value||undefined }) }/>
                发生过事故或重大故障。
                <Input value={inp?.被重大 ||''} size={2} style={{display: 'inline-flex', width: 'unset'}}
                       onChange={e => setInp({ ...inp, 被重大: e.currentTarget.value||undefined }) }/>
                被重大维修和改造过。 电梯运行环境
                <Input value={inp?.行环境 ||''} size={13} style={{display: 'inline-flex', width: 'unset'}}
                       onChange={e => setInp({ ...inp, 行环境: e.currentTarget.value||undefined }) }/>
                ，电梯运行状况
                <Input value={inp?.行状况 ||''} size={13} style={{display: 'inline-flex', width: 'unset'}}
                       onChange={e => setInp({ ...inp, 行状况: e.currentTarget.value||undefined }) }/>
                。
               </InspectRecordLayout>
        );
    } );

const config间隙表=[['层站','n',66],['门扇间间隙','j',60],['门扇立柱间隙','z',60],['门扇门楣间隙','t',60,],['门扇地坎间隙','s',60],['扇施力间隙','p',60],
                ['门刀地坎间距','i',60], ['滚轮地坎间距','g',60,], ['门锁啮合长','l',60]] as Each_ZdSetting[];
// const item间隙=[];
const itemA间隙=['间隙表','门扇隙r','门柱间r','门楣隙r','门地间r','施力隙r','门坎间r','滚地间r','锁啮深r'];
export const DoorGap=
    React.forwardRef(({ children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const [getInpFilter]=useMeasureInpFilter(null,itemA间隙,);
        const {inp, setInp} = useItemInputControl({ ref });
        const headview=<Text variant="h5">
           观测数据（二）：参照上面样表的第5行的标注的各列的简化后的列名来进行录入,结果行拆出单独录入。单位：mm
        </Text>;
        const [render间隙表]=useTableEditor({inp, setInp,  headview,
            config: config间隙表, table:'间隙表', column:8});
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'六、观测数据（二）'}>
                样表格式如下：
                <Table tight  miniw={800}><TableBody>
                    <TableRow>
                        <CCell>项目编号</CCell><CCell colSpan={5}>9.5A</CCell><CCell colSpan={2}>9.9A</CCell><CCell>9.6A</CCell>
                    </TableRow>
                    <TableRow>
                        <CCell>检验内容</CCell><CCell>门扇间间隙</CCell><CCell>门扇与立柱间隙</CCell><CCell>门扇与门楣间隙</CCell><CCell>门扇与地坎间隙</CCell>
                        <CCell>层门扇间施力间隙</CCell><CCell>轿门门刀与层门地坎间距</CCell><CCell>门锁滚轮与轿门地坎间距</CCell><CCell>门锁啮合长度</CCell>
                    </TableRow>
                    <TableRow>
                        <CCell rowSpan={2}>判断标准</CCell><CCell rowSpan={2} colSpan={4}>x≤10</CCell><CCell>旁开门：x≤30</CCell>
                        <CCell rowSpan={2} colSpan={2}>5≤x≤10</CCell><CCell rowSpan={2}>x≥7</CCell>
                    </TableRow>
                    <TableRow>
                        <CCell>中分门总和：x≤45</CCell>
                    </TableRow>
                    <TableRow>
                        <CCell>层站</CCell><CCell>门扇间间隙</CCell><CCell>门扇立柱间隙</CCell><CCell>门扇门楣间隙</CCell><CCell>门扇地坎间隙</CCell>
                        <CCell>扇施力间隙</CCell><CCell>门刀地坎间距</CCell><CCell>滚轮地坎间距</CCell><CCell>门锁啮合长</CCell>
                    </TableRow>
                    <TableRow>
                        <CCell>检验结果</CCell><CCell></CCell><CCell></CCell><CCell colSpan={3}></CCell><CCell></CCell><CCell></CCell><CCell></CCell>
                    </TableRow>
                </TableBody></Table>
                {render间隙表}
                <hr/>
                上表最后一行结果行的录入拆出来：
                <LineColumn column={6}>
                    <InputLine label={`9.5A门扇间间隙-检验结果`}>
                        <SelectHookfork value={ inp?.门扇隙r ||''}
                                        onChange={e => setInp({ ...inp, 门扇隙r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.5A门扇与立柱间隙-检验结果`}>
                        <SelectHookfork value={ inp?.门柱间r ||''}
                                        onChange={e => setInp({ ...inp, 门柱间r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.5A门扇与门楣间隙-检验结果`}>
                        <SelectHookfork value={ inp?.门楣隙r ||''}
                                        onChange={e => setInp({ ...inp, 门楣隙r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.5A门扇与地坎间隙-检验结果`}>
                        <SelectHookfork value={ inp?.门地间r ||''}
                                        onChange={e => setInp({ ...inp, 门地间r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.5A层门扇间施力间隙-检验结果`}>
                        <SelectHookfork value={ inp?.施力隙r ||''}
                                        onChange={e => setInp({ ...inp, 施力隙r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.9A轿门门刀与层门地坎间距-检验结果`}>
                        <SelectHookfork value={ inp?.门坎间r ||''}
                                        onChange={e => setInp({ ...inp, 门坎间r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.9A门锁滚轮与轿门地坎间距-检验结果`}>
                        <SelectHookfork value={ inp?.滚地间r ||''}
                                        onChange={e => setInp({ ...inp, 滚地间r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                    <InputLine label={`9.6A门锁啮合长度-检验结果`}>
                        <SelectHookfork value={ inp?.锁啮深r ||''}
                                        onChange={e => setInp({ ...inp, 锁啮深r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                注：本表所列项目检测人员无测量的不记录。
            </InspectRecordLayout>
        );
    } );

interface SpeedLimiterItemProps  extends InternalItemProps{
    //【复用办法】 针对限速器的类型
    usecj?: number;    //2=对重限速器？   默认usecj==1=轿厢限速器；
}
export const SpeedLimiter=
    React.forwardRef(({ children, show ,alone=true,refWidth,usecj}:SpeedLimiterItemProps,  ref
    ) => {
        const baseN= usecj===2? '对':'轿';
        const [itemLimiter, itemAlimiter] =React.useMemo(() => {
            const baseN=usecj===2? '对':'轿';
            // const item限速器=['' ];        //假若：=['' ] 运行时有'o' 'v'两个虚的变量；可是存储到后端就不会有多余的2个字段的！
            //实际上：'气速下','械速下','气速上','械速上'：名字加热后缀 '对'..，而且保存结果还是数组类型的[速度1, ,速度3]。
            const itemA限速器=['限制单','限额速','钳匹类','气速下','械速下','气速上','械速上','度下限','度上限','速器论'].map(a=>a+baseN);
            if(usecj===2){
                itemA限速器.push('对限上电气速','对限上机械速','对限下电气速','对限下机械速');
                //原本usecj==1该配对的，但是台账就有的参数没必要录入的：  限速上电气速;  限速上机械速;   限速下电气速;  限速下机械速;
            }
            return [null, itemA限速器];
        }, [usecj]);
        const [getInpFilter]=useMeasureInpFilter(null, itemAlimiter, );        //hook死循环
        const {inp, setInp} = useItemInputControl({ ref });
        const aveThick=calcAverageArrObj([inp?.力面厚1o,inp?.力面厚2o,inp?.力面厚3o],(row)=>row,2);
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={`附录A 电梯限速器动作速度校验：${usecj===2? '对重':'轿厢'}`}>
                附录A 电梯限速器动作速度校验--{usecj===2? '对重':'轿厢'}限速器，其基本参数是：<br/>
                <InputLine  label='限速器制造单位' >
                    <BlobInputList  value={inp?.['限制单'+baseN] ||''}
                                    onListChange={v => setInp({...inp,['限制单'+baseN]:v || undefined}) }/>
                </InputLine>
                <LineColumn column={6} >
                    <InputLine  label='额定速度' >
                        <SuffixInput  value={inp?.['限额速'+baseN] ||''} onSave={txt=> setInp({...inp,['限额速'+baseN]: txt || undefined })}>m/s</SuffixInput>
                    </InputLine>
                    { usecj===2 &&<>
                            <InputLine  label='标牌电气动作速度（下行）' >
                                <SuffixInput  value={inp?.['对限下电气速'] ||''} onSave={txt=> setInp({...inp,对限下电气速: txt || undefined })}>m/s</SuffixInput>
                            </InputLine>
                            <InputLine  label='标牌机械动作速度（下行）' >
                                <SuffixInput  value={inp?.['对限下机械速'] ||''} onSave={txt=> setInp({...inp,对限下机械速: txt || undefined })}>m/s</SuffixInput>
                            </InputLine>
                            <InputLine  label='标牌电气动作速度（上行）' >
                                <SuffixInput  value={inp?.['对限上电气速'] ||''} onSave={txt=> setInp({...inp,对限上电气速: txt || undefined })}>m/s</SuffixInput>
                            </InputLine>
                            <InputLine  label='标牌机械动作速度（上行）' >
                                <SuffixInput  value={inp?.['对限上机械速'] ||''} onSave={txt=> setInp({...inp,对限上机械速: txt || undefined })}>m/s</SuffixInput>
                            </InputLine>
                        </>
                    }
                    <InputLine  label='安全钳匹配类型' >
                        <Input  value={inp?.['钳匹类'+baseN] ||''}
                                onChange={e => setInp({...inp,['钳匹类'+baseN]:e.currentTarget.value || undefined}) }/>
                    </InputLine>
                </LineColumn>
                {usecj===2? '对重':'轿厢'}限速器的观测值： {'>>'}
                <LineColumn column={2} >
                    <div>
                        <Text css={{marginLeft: '3rem'}}>电气动作速度（下行） 测量值</Text>
                        <LineColumn column={8}  >
                            { (new Array(3)).fill(null).map(( _,  w:number) => {
                                return <InputLine key={w} label={`v1${w+1} =`}>
                                    <SuffixInput  value={inp?.['气速下'+baseN]?.[w] ||''} onSave={txt=>arraySetInp('气速下'+baseN,w,txt,inp,setInp)}>m/s</SuffixInput>
                                </InputLine>;
                            }) }
                            <Text>电气动作速度（下行）平均值= {calcAverageArrObj(inp?.['气速下'+baseN],a=>a,2,3)} m/s</Text>
                                {/* const avspeed2=calcAverageArrObj(orc.主降速表,(row)=>{return row?.d/row?.t},2); */}
                        </LineColumn>
                    </div>
                    <div>
                        <Text css={{marginLeft: '3rem'}}>机械动作速度（下行） 测量值</Text>
                        <LineColumn column={8}  >
                            { (new Array(3)).fill(null).map(( _,  w:number) => {
                                return <InputLine key={w} label={`v2${w+1} =`}>
                                    <SuffixInput  value={inp?.['械速下'+baseN]?.[w] ||''} onSave={txt=>arraySetInp('械速下'+baseN,w,txt,inp,setInp)}>m/s</SuffixInput>
                                </InputLine>;
                            }) }
                            <Text>机械动作速度（下行）平均值= {calcAverageArrObj(inp?.['械速下'+baseN],a=>a,2,3)} m/s</Text>
                        </LineColumn>
                    </div>
                    <div>
                        <Text css={{marginLeft: '3rem'}}>电气动作速度（上行） 测量值</Text>
                        <LineColumn column={8}  >
                            { (new Array(3)).fill(null).map(( _,  w:number) => {
                                return <InputLine key={w} label={`v3${w+1} =`}>
                                    <SuffixInput  value={inp?.['气速上'+baseN]?.[w] ||''} onSave={txt=>arraySetInp('气速上'+baseN,w,txt,inp,setInp)}>m/s</SuffixInput>
                                </InputLine>;
                            }) }
                            <Text>电气动作速度（上行）平均值= {calcAverageArrObj(inp?.['气速上'+baseN],a=>a,2,3)} m/s</Text>
                        </LineColumn>
                    </div>
                    <div>
                        <Text css={{marginLeft: '3rem'}}>机械动作速度（上行） 测量值</Text>
                        <LineColumn column={8}  >
                            { (new Array(3)).fill(null).map(( _,  w:number) => {
                                return <InputLine key={w} label={`v4${w+1} =`}>
                                    <SuffixInput  value={inp?.['械速上'+baseN]?.[w] ||''} onSave={txt=>arraySetInp('械速上'+baseN,w,txt,inp,setInp)}>m/s</SuffixInput>
                                </InputLine>;
                            }) }
                            <Text>机械动作速度（上行）平均值= {calcAverageArrObj(inp?.['械速上'+baseN],a=>a,2,3)} m/s</Text>
                        </LineColumn>
                    </div>
                </LineColumn>
                <LineColumn column={6} >
                    <InputLine  label='动作速度下限值' >
                        <SuffixInput  value={inp?.['度下限'+baseN] ||''} onSave={txt=> setInp({...inp,['度下限'+baseN]: txt || undefined })}>m/s</SuffixInput>
                    </InputLine>
                    <InputLine  label='动作速度上限值' >
                        <SuffixInput  value={inp?.['度上限'+baseN] ||''} onSave={txt=> setInp({...inp,['度上限'+baseN]: txt || undefined })}>m/s</SuffixInput>
                    </InputLine>
                    <InputLine label={`${usecj===2? '对重':'轿厢'}限速器-校验结论`}>
                        <SelectHookfork value={inp?.['速器论'+baseN] ||''}
                                        onChange={e => setInp({ ...inp, ['速器论'+baseN]: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
            </InspectRecordLayout>
        );
    } );

//抽象化一点做法： 电梯制动试验
const itemA制动距离=[] as string[];
//初始化 存储字段
norms制动试验.forEach(({n : name} : any, i:number)=> {
    const names=[name +'上',  name +'下'];
    itemA制动距离.push( ...names );
});
export const Braking=
    React.forwardRef(({ children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const [getInpFilter]=useMeasureInpFilter(null,itemA制动距离,);
        const {inp, setInp} = useItemInputControl({ ref });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'附录B 电梯制动试验'}>
                附录B 电梯制动试验<br/>
                { [['上行','上'],['下行','下']].map(([title,tail], p:number) => {
                    return  <React.Fragment key={p}>
                        方向 {'>'} {title}：
                        <LineColumn column={6}>
                            { norms制动试验.map((conf, i:number) => {
                                return <InputLine key={i} label={`${conf?.d}：`}>
                                    <SuffixInput  value={inp?.[conf?.n+tail] ||''}
                                                  onSave={txt=> setInp({...inp,[conf?.n+tail]: txt || undefined })}>{conf?.u}</SuffixInput>
                                </InputLine>;
                            }) }
                        </LineColumn>
                    </React.Fragment>;
                }) }
            </InspectRecordLayout>
        );
    } );

const itemA运行质=[] as string[];
['平晃峰','平晃最','垂抖峰','垂抖最','厢内噪','关门噪'].forEach((name, i:number)=> {
    const names=[name,  name +'r'];
    itemA运行质.push( ...names );
});
export const Operation=
    React.forwardRef(({ children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const [getInpFilter]=useMeasureInpFilter(null, itemA运行质, );
        const {inp, setInp} = useItemInputControl({ ref });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'附录C 电梯运行质量检测记录表'}>
                附录C 电梯运行质量检测记录表:<br/>
                <Text>
                    项目检测方法:
                    <Text css={{display: 'flex', marginLeft:'1.3rem'}}>
                        序号1-4，轿厢水平晃动 和 轿厢垂直抖动 ：<br/>
                        检测时轿厢空载，以正常速度上、下全行程运行各1次，采用电梯综合质量分析仪进行定量检测。取两次运行中各自最大的数据。<br/>
                        序号5，轿厢内噪声 ：<br/>
                        轿厢空载以正常速度上、下运行，检验人员在轿厢内用声级计测量轿厢噪声。取最大值。<br/>
                        序号6，开关门噪声 ：<br/>
                        采用声级计在行程上、中、下部各抽查一处测量开关门过程中最大的噪声。取最大值。
                    </Text>
                </Text>
                <hr/>
                1项目: 轿厢水平晃动 》 A95峰峰值：检测要求 ≤15cm/s<sup>2</sup>
                <LineColumn column={6}>
                    <InputLine label={`1项目:A95峰峰值-实测值`}>
                        <SuffixInput  value={inp?.平晃峰 ||''}
                                      onSave={txt=> setInp({...inp,平晃峰: txt || undefined })}>cm/s<sup>2</sup></SuffixInput>
                    </InputLine>
                    <InputLine label='1项目:A95峰峰值-检测结果'>
                        <SelectHookfork value={ inp?.平晃峰r ||''}
                                        onChange={e => setInp({ ...inp, 平晃峰r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                2项目: 轿厢水平晃动 》 最大峰峰值：检测要求 ≤20cm/s<sup>2</sup>
                <LineColumn column={6}>
                    <InputLine label={`2项目:最大峰峰值-实测值`}>
                        <SuffixInput  value={inp?.平晃最 ||''}
                                      onSave={txt=> setInp({...inp,平晃最: txt || undefined })}>cm/s<sup>2</sup></SuffixInput>
                    </InputLine>
                    <InputLine label='2项目:最大峰峰值-检测结果'>
                        <SelectHookfork value={ inp?.平晃最r ||''}
                                        onChange={e => setInp({ ...inp, 平晃最r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                3项目: 轿厢垂直抖动 》 A95峰峰值：检测要求 ≤20cm/s<sup>2</sup>
                <LineColumn column={6}>
                    <InputLine label={`3项目:A95峰峰值-实测值`}>
                        <SuffixInput  value={inp?.垂抖峰 ||''}
                                      onSave={txt=> setInp({...inp,垂抖峰: txt || undefined })}>cm/s<sup>2</sup></SuffixInput>
                    </InputLine>
                    <InputLine label='3项目:A95峰峰值-检测结果'>
                        <SelectHookfork value={ inp?.垂抖峰r ||''}
                                        onChange={e => setInp({ ...inp, 垂抖峰r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                4项目: 轿厢垂直抖动 》 最大峰峰值：检测要求 ≤30cm/s<sup>2</sup>
                <LineColumn column={6}>
                    <InputLine label={`4项目:最大峰峰值-实测值`}>
                        <SuffixInput  value={inp?.垂抖最 ||''}
                                      onSave={txt=> setInp({...inp,垂抖最: txt || undefined })}>cm/s<sup>2</sup></SuffixInput>
                    </InputLine>
                    <InputLine label='4项目:最大峰峰值-检测结果'>
                        <SelectHookfork value={ inp?.垂抖最r ||''}
                                        onChange={e => setInp({ ...inp, 垂抖最r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                5项目: 噪声 》 轿厢内噪声：检测要求 V≤2.5m/s的电梯应≤55dB(A)，2.5m/s{'<'}V≤6.0m/s的电梯应≤60dB(A)
                <LineColumn column={6}>
                    <InputLine label={`5项目:轿厢内噪声-实测值`}>
                        <SuffixInput  value={inp?.厢内噪 ||''}
                                      onSave={txt=> setInp({...inp,厢内噪: txt || undefined })}>dB(A)</SuffixInput>
                    </InputLine>
                    <InputLine label='5项目:轿厢内噪声-检测结果'>
                        <SelectHookfork value={ inp?.厢内噪r ||''}
                                        onChange={e => setInp({ ...inp, 厢内噪r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
                6项目: 噪声 》 开关门噪声：检测要求 ≤65dB(A)
                <LineColumn column={6}>
                    <InputLine label={`6项目:开关门噪声-实测值`}>
                        <SuffixInput  value={inp?.关门噪 ||''}
                                      onSave={txt=> setInp({...inp,关门噪: txt || undefined })}>dB(A)</SuffixInput>
                    </InputLine>
                    <InputLine label='6项目:开关门噪声-检测结果'>
                        <SelectHookfork value={ inp?.关门噪r ||''}
                                        onChange={e => setInp({ ...inp, 关门噪r: e.currentTarget.value||undefined}) }/>
                    </InputLine>
                </LineColumn>
            </InspectRecordLayout>
        );
    } );


const config平衡表=[['P(载重量)与Pe(额定载重量)的百分比(%)','n',158],['P(kg)','P',90],['电压V（V）上行','u',84,(obj,setObj)=>{
    return <SuffixInput  value={obj?.u ||''} onSave={txt=> setObj({...obj,u: txt || undefined })}>V</SuffixInput>
}],['电压V（V）下行','d',84,(obj,setObj)=>{
    return <SuffixInput  value={obj?.d ||''} onSave={txt=> setObj({...obj,d: txt || undefined })}>V</SuffixInput>
}],['电流I（A）上行','s',84,(obj,setObj)=>{
    return <SuffixInput  value={obj?.s ||''} onSave={txt=> setObj({...obj,s: txt || undefined })}>A</SuffixInput>
}],['电流I（A）下行','x',84,(obj,setObj)=>{
    return <SuffixInput  value={obj?.x ||''} onSave={txt=> setObj({...obj,x: txt || undefined })}>A</SuffixInput>
}]] as Each_ZdSetting[];
export const 默认平衡比例=[0,20,30,40,50,60];
const itemA平衡=['额定载荷','平衡表','中部速','速百分','衡系数','衡仪果'];
export const Equilibrium=
    React.forwardRef(({ children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const defvcbFunc = React.useCallback((par: any) => {
            const { 平衡表 }=par||{};
            if(!平衡表 || 平衡表.length<1){
                let 默认平衡=[] as any;
                if(!(par.额定载荷))     return par;   //必须作为前置条件的！ throw new Error("额定载荷没数据"); 打印简易原始记录没有注入数据的？
                默认平衡比例.forEach((percent, i:number)=> {          //额定载荷：不会随意改的基础技术参数。
                    let obj={n:percent, P: (par.额定载荷)*percent/100};
                    默认平衡.push(obj);
                });
                par.平衡表=默认平衡;            //defaultV:默认平衡,
            }
            return  par;
        }, []);
        const [getInpFilter]=useMeasureInpFilter(null,itemA平衡,defvcbFunc);
        const {inp, setInp} = useItemInputControl({ ref });
        const headview=<Text variant="h5">
            附录D 电梯平衡系数和运行速度检验记录；
        </Text>;
        const [render平衡表]=useTableEditor({inp, setInp,  headview,
            config: config平衡表, table:'平衡表',  noDelAdd:true, fixColumn:2, column:6});
        //制图所需数据的转换： n:[30, 40, 45, 50, 60]排序； A:{s x} V:{u d}
        let yu: number[]=[];
        let yd: number[]=[];
        let ytype='';
        //【前提条件】inp?.平衡表的存储DB后 顺序不能改掉的：必须[30,40,45,50,60]对应顺序的。
        inp?.平衡表?.forEach((clObj:any, i:number)=> {
            if(clObj?.n!==默认平衡比例[i])    throw new Error("顺序30,40,45,50,60不能改");
            yu[i]=clObj?.s;
            yd[i]=clObj?.x;
        });
        if( yu.some(a=> !a) || yd.some(a=> !a) )
        {
            inp?.平衡表?.forEach((clObj:any, i:number)=> {
                if(clObj?.n!==默认平衡比例[i])    throw new Error("顺序30,40,45,50,60不能改");
                yu[i]=clObj?.u;
                yd[i]=clObj?.d;
            });
            if( !yu.some(a=> !a) && !yd.some(a=> !a) )
                ytype='V';
        }
        else ytype='A';
        const {renderMap}=useBalanceCoefficient({type:ytype, yu ,yd, xp:默认平衡比例 });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'附录D 电梯平衡系数和运行速度检验记录'}>
                {inp?.额定载荷?  render平衡表 : <Alert intent={"error"} title={'没有额定载荷数据，就无法试验'}/>}
                <hr/>
                当轿厢内载重量为额定载重量的50%时，轿厢向下运行至行程中部时速度v={inp?.['中部速']} m/min：
                <LineColumn column={4}>
                    <InputLine label={`轿厢向下运行至行程中部时速度v`}>
                        <SuffixInput  value={inp?.['中部速'] ||''} onSave={txt=> setInp({...inp,中部速: txt || undefined })}>m/min</SuffixInput>
                    </InputLine>
                    <InputLine label={`1、所测的速度v与额定速度的百分比为`}>
                        <SuffixInput  value={inp?.['速百分'] ||''} onSave={txt=> setInp({...inp,速百分: txt || undefined })}>%</SuffixInput>
                    </InputLine>
                    <InputLine label={`2、经测定，绘成曲线后，交叉点的对应的横坐标即为此台电梯的平衡系数为K`}>
                        <SuffixInput  value={inp?.['衡系数'] ||''} onSave={txt=> setInp({...inp,衡系数: txt || undefined })}>%</SuffixInput>
                    </InputLine>
                    <InputLine label={`用平衡系数专用测量仪器测量结果`}>
                        <SuffixInput  value={inp?.['衡仪果'] ||''} onSave={txt=> setInp({...inp,衡仪果: txt || undefined })}>%</SuffixInput>
                    </InputLine>
                </LineColumn>
                {inp?.额定载荷 && renderMap}
            </InspectRecordLayout>
        );
    } );
/**简易版的原始记录 打印 位于最前面的内容
 * */
export const FrontCover=
    React.forwardRef((
        { children, show ,alone=true,refWidth}:InternalItemProps,  ref
    ) => {
        const theme = useTheme();
        const getInpFilter = React.useCallback((par: any) => {
            const {} =par||{};
            return {};
        }, []);
        const {inp, setInp} = useItemInputControl({ ref });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp}  getInpFilter={getInpFilter} show={show}
                                 alone={alone}  label={'填 写 须 知'}>
                <Text variant="h5">
                    填 写 须 知
                </Text>
                1、原始记录中填写的文字、符号的表达应正确、完整。<br/>
                2、需要以文字、数据和计量单位、符号等来描述现场检验情况的栏目有：
                <div css={{marginLeft: '2rem', display: 'flex',}}>
                    2.1设备概况；<br/>
                    2.2评估依据；<br/>
                    2.3主要检测仪器；<br/>
                    2.4评估结论；<br/>
                    2.5评估记录中的“检测结果、“严重程度”、“风险频率”、“风险类别”、“分值”、“确认方式或存在问题描述”；<br/>
                    2.6观测数据与检测结果。
                </div>
                3、评估记录表填写说明
                <div css={{marginLeft: '2rem', display: 'flex',}}>
                    3.1在“检测结果”栏中的统一用以下方式表示记录内容：<br/>
                    符合要求的项目 -- --该项记录内容为“√”；<br/>
                    不符合要求的项目 -- --该项记录内容为“×”，并在“确认方式或存在问题描述”栏中记录
                    实际情况；<br/>
                    采用资料确认的项目 -- --该项记录内容为“▽”，并在“确认方式或存在问题描述”栏中记录
                    见证资料名称；<br/>
                    无此项内容的项目 -- --该项记录内容为“/”；<br/>
                    无法检测或待检测的项目 -- --表示该项记录内容为“△”，并在“确认方式或存在问题描述”栏中记录无法检验或待检验简要原因。<br/>
                    3.2 “严重程度”、“风险频率”和“风险类别”填写说明<br/>
                    严重程度：1-高 2-中 3-低 4-可忽略；<br/>
                    风险频率：A-频繁 B-很可能 C-偶尔 D-极少 E-不大可能 F-几乎不可能；<br/>
                    风险类别：依据“严重程度”和“风险频率”确定。<br/>
                    3.3有使用仪器测试的项目将实测结果数据填写在附录。
                </div>
                4、“备注”栏中主要记录需要说明的其它事项。<br/>
                5、评估人员、校核人员的责任签署应齐全，若评估人员只承担部分的检测项目，可在“备注”栏中加以说明。
            </InspectRecordLayout>
        );
    } );
